Berechnung der Pixel - RAM - Adresse (1) vorher: HL:= Punktposition (H:= vertikal 0...FFH, L:= horiz. 0...1FH) nachher: DE:= Pixel - RAM - Adresse VR: AP, HL, DE ----------------------------------------------------------------------------------------- 11 00 00 LD DE, 0H CB 44 BIT 0, H 20 02 JR NZ M1 CB 73 SET 6, E CB 40 M1: BIT 1, H 20 02 JR NZ M2 CB FB SET 7, E CB 54 M2: BIT 2, H 20 02 JR NZ M3 CB E3 SET 4, E CB 5C M3: BIT 3, H 20 02 JR NZ M4 CB EB SET 5, E CB 64 M4: BIT 4, H 20 02 JR NZ M5 CB C2 SET 0, D CB 6C M5: BIT 5, H 20 02 JR NZ M6 CB CA SET 1, D CB 74 M6: BIT 6, H 20 02 JR NZ M7 CB D2 SET 2, D CB 7C M7: BIT 7, H 20 02 JR NZ M8 CB DA SET 3, D B7 M8: OR A CB 13 RL E CB 12 RL D CB FA SET 7, D 7D LD A, L 83 ADD E 5F LD E, A C9 RET Länge: 62 Byte Zeit: 244 ... 284 Taktzyklen (durchschnittlich 264T) =================================================== Berechnung der Pixel - RAM - Adresse (2) vorher: HL:= Punktposition (H:= vertikal 0...FFH, L:= horiz. 0...FFH) nachher: DE:= Pixel - RAM - Adresse VR: AF, DE -------------------------------------------------------------------------------------------- 7C LD A, H 2F CPL 57 LD D, A E6 03 AND 3H 0F RRCA 0F RRCA 5F LD E, A 71 LD A, D E6 0C AND 0CH 07 RLCA 07 RLCA B3 OR E 5F LD E, A 71 LD A, D E6 F0 AND F0H 0F RRCA 0F RRCA 0F RRCA 0F RRCA 57 LD D, A B7 OR A CB 13 RL E CB 12 RL D CB FA SET 7, D 7D LD A, L E6 F8 AND F8H 0F RRCA 0F RRCA 0F RRCA 83 ADD E 5F LD E, A C9 RET Länge: 39 Byte Zeit: 155 Taktzyklen =================================================== Berechnung der Pixel - RAM - Adresse (3) vorher: HL:= Punktposition (H:= vertikal 0...FFH, L:=horiz. 0...1FH) nachher: DE:= Pixel - RAM - Adresse VR: AF, DE -------------------------------------------------------------------------------------------- 7C LD A, H 2F CPL 57 LD D, A E6 03 AND 3H 0F RRCA 0F RRCA 5F LD E, A E6 0C AND 0CH 07 RLCA 07 RLCA B3 OR E 5F LD E, A 7A LD A, E E6 F0 AND F0H 0F RRCA 0F RRCA 0F RRCA 0F RRCA 57 LD D, A B7 OR A CB 13 RL E CB 12 RL D CB FA SET 7, D 7D LD A, L 83 ADD E 5F LD E, A C9 RET Länge: 34 Byte Zeit: 139 Taktzyklen ======================================================= Punkt setzen im Pixel - RAM vorher: HL:= Position (H:= vertikal 0...FFH, L:=horiz. 0...FFH) nachher: Punkt gesetzt, DE:= Pixel - RAM - Adresse VR: AF, HL, DE, B ----------------------------------------------------------------------------------------------------- 7C LD A, H 2 F CPL 47 LD B, A E6 03 AND 3H 0F RRCA 0F RRCA 5F LD E, A 78 LD A, B E6 0C AND 0CH 07 RLCA 07 RLCA B3 OR E 5F LD E, A 78 LD A, B E6 F0 AND F0H 0F RRCA 0F RRCA 0F RRCA 0F RRCA 57 LD D, A B7 OR A CB 13 RL E CB 12 RL D CB FA SET 7, D 7D LD A, L E6 F8 AND F8H 0F RRCA 0F RRCA 0F RRCA 83 ADD E 5F LD E, A 7D LD A, L E6 07 AND 7H 47 LD B, A 3E 80 LD A, 80H 0F LOOP: RRCA 10 FD DJNZ LOOP 47 LD B, A 1A LD A, (DE) B0 OR B 12 LD (DE), A C9 RET ======================================================= Punkt löschen im Pixel - RAM vorher: HL:= Position (H:= vertikal 0...FFH, L:= horiz. 0...FFH) nachher: Punkt gelöscht, Z=1 Punkt war nicht gesetzt, Z= Punkt war gesetzt DE:= Pixel - RAM - Adresse VR: AF, HL, DE, BC --------------------------------------------------------------------------------------------------- 7C LD A, H 2F CPL 47 LD B, A E6 03 AND 3H 0F RRCA 0F RRCA 5F LD E, A 78 LD A, B E6 0C AND 0CH . 07 RLCA 07 RLCA B3 OR E 5F LD E, A 78 LD A, B E6 F0 AND F0H 0F RRCA 07 RRCA 07 RRCA 07 RRCA 57 LD D, A B7 OR A CB 13 RL E CB 12 RL D CB FA SET 7, D 7D LD A, L E6 F8 AND F8H 0F RRCA 0F RRCA 0F RRCA 83 ADD E 5F LD E, A 7D LD A, L E6 07 AND 7H 47 LD B, A 3E 7F LD A, 7FH 0F LOOP: RRCA 10 FD DJNZ LOOP 47 LD B, A 1A LD A, (DE) 4F LD C, A A0 AND B 12 LD (DE), A B9 CP C C9 RET ==================================================== Tastatur-Eingabe mit Einblendung des Cursors Eingabe: 0 ... 9 / A ... Z / Sonderzeichen vorher: HL:= Cursor-Position B:= Anzahl der Zeichen VR: AF, HL, B ----------------------------------------------------------------------------------------------- 22 A0 B7 LB (B7A0H), HL CD 03 F0 E ING: CALL F003H 04 DB 4 FE 20 (30) (41) CP 21H 38 F8 | | JRC EING FE 5B (3A) (5B) CP 5BH 30 F4 | | JR NC EING CD 03 F0 | | CALL F003H 00 | | DB 0 10 EE | | DJNZ EING C9 | | RET | | | |------nur Buchstaben A ... Z |------------nur Zahlen 0 ... 9 ===================================================== Tastatur-Eingabe mit Einblendung des Cursors Eingabe: 0 ... 9 / A ... Z / Sonderzeichen Ende der Eingabe mit Taste ENTER vorher: HL:= Cursor-Position VR: AF, HL ------------------------------------------------------------------------------------------------ 22 AO B7 LD (B7A0H), HL CD 03 F0 EING: CALL F003H 04 DB 4 FE 0D CP 0DH 28 0E JR Z END FE 20 CP 20H 38 F4 JR C EING FE 5B CP 5BH 30 F0 JR NC EING CD 03 F0 CALL F003H 00 DB 0 18 BA JR EING C9 END: RET ===================================================== Löschen des PIXEL - RAM (schnelles CLS) VR: AF, HL ----------------------------------------------------------------------------------------------- 21 00 80 LD HL, 8000H AF NEXT : XOR A 77 LD (HL), A 23 INC HL 7D LD A, L B7 OR A 20 F9 JR NZ NEXT 7C LD A, H FE A0 (A8)* CP 0A0H (A8)* 20 F4 JR NZ NEXT C9 RET * A0H für linken Teil, A8H für gesamten Bildschirm löschen. ===================================================== Löschen des PIXEL - RAM (noch schneller) VR: AF, HL ----------------------------------------------------------------------------------------------- 21 00 80 LD HL 8000H 36 00 NEXT: LD (HL), 0H 23 INC HL 7C LD A, H FE A8 CP A8H 20 F8 JR NZ NEXT C9 RET ===================================================== Color - RAM setzen vorher: C:= Farbbyte (Vorder- u.Hintergrund) VR: AF, HL, C ----------------------------------------------------------------------------------------------- 21 00 A8 LD HL, A800H 71 NEXT: LD (HL), C 23 INC HL 7C LD A, H FE B2 CP B2H 20 F9 JR NZ NEXT C9 RET ===================================================== Fenster setzen vorher: H:= Zeilenanfang L:= Spaltenanfang D:= Zeilenende, max. 20H E:= Spaltenende, max. 27H C:= Vorder- uo Hintergrundfarbe VR: AF, HL, DE, C ------------------------------------------------------------------------------------------------ 22 9C B7 LD (B79CH), HL EB EX DE, HL B7 OR A ED 52 SBC HL DE 22 9E B7 LD (B79EH), HL 79 LB A, C 32 A3 B7 LD (B7A3H), A CD 03 F0 CALL UP-CAOS 23 DB 23H 0C clear screen 10 Cursor obere linke Ecke 00 DB 0 09 RET ====================================================== Darstellung einer dreistelligen Dezimalzahl vorher: DE:= dezimal Zahl 0 ... 999 VR: AF, DE, C ------------------------------------------------------------------------------------------------- D5 PUSH DE 7A LD A, D C6 30 ADD 30HI 1E 00 LD E, 0H CD 09 F0 CALL F009H D1 POP DE 7B LD A, E 4B LD C, E E6 F0 AND F0H 0F RRCA 0F RRCA 0F RRCA 0F RRCA C6 30 ADD 30H 1E 00 LD E, 0H CD 09 F0 CALL F009H 79 LD A, C E6 0F AND 0FH C6 30 ADD 30H CD 09 F0 CALL F009H C9 RET (schneller als UP 1A zur Darstellung von HL) ===================================================== Sortieren von Datensätzen mit konstanter Satzlänge vorher: C:= Satzlänge max. 255 Zeichen; B:= 0 yy xx:= Anfang 1.Satz zz:= Sortierbereich VR: AP, HL, DE, BC ----------------------------------------------------------------------------------------------- C5 PUSH BC 21 yy xx SORT: LD HL, xxyy ;Anfang 1. Satz C1 POP BC E5 PUSH HL 09 ADD HL, BC EB EX DE, HL E1 POP HL C5 PUSH BC D5 NEXT1: PUSH DE E5 PUSH HL 06 zz LD B, zz ;Sortierbereich 1A NEXT2 : LD A, (DE) 4E LD C, (HL) B9 CP C 20 15 JR NC UNGL 13 INC DE 23 INC HL 10 F7 DJNZ NEXT2 E1 NEXT3: POP HL D1 POP DE C1 POP BC C5 PUSH BC 09 ADD HL, BC E5 PUSH HL EB EX DE, HL 09 .ADD 9BC D1 POP DE EB EX DE, HL 1A LD A, (DE) FE FF CP FFH _ 20 E4 JR NZ NEXT1 E1 END: POP HL C9 RET 91 UNGL: SUB C 30 EC JR NC NEXT3 E1 POP HL D1 POP DE C1 POP BC C5 PUSH BC 41 LD B, C 1A NEXT4: LD A, (DE) 4E LD C, (HL) 77 LD (HL), A 79 LD A, C 12 LD (DE), A 23 INC HL 13 INC DE 10 F7 DJNZ NEXT4 18 C6 JR SORT Bedingungen: Ende aller Datensätze FFH; konstante Satzlänge; Sortierbereich beginnt ab 1. Zeichen bis max. Satzlänge minus 1. ======================================================== Multiplikation natürlicher Zahlen (1) A-E := E * C VR: AF, BC, E ----------------------------------------------------------------------------------------------------- AF MP1: XOR A 06 08 LD B, 8H CB 1B RR E 30 01 MP1A: JR NC MP1B 81 ADD C 1F MP1B: RRA CB 1B RR E 10 F8 DJNZ MP1A C9 RET ----------------------------------------------------------------------------------------------------- (2) HL-A-C := A-C * DE VR: AF, HL, DE, BC ----------------------------------------------------------------------------------------------------- 21 00 MP2: LD HL, 0H 06 10 LD B, 10H 1F RR A CB 19 RR C 30 01 MP2A: JR NC MP2B 19 ADD HL, DE CB 1C MB2B: RR H CB 1D RR L 1F RR A CB 19 RR C 10 F4 DJNZ MP2A C9 RET ----------------------------------------------------------------------------------------------------- (3) A-HL-HL'-D' := C-DE * HL'-D' VR: AF, HL, DE, BC, HL', DE' ----------------------------------------------------------------------------------------------------- AF MP3: XOR A 67 LD H, A 6F LD L, A 06 18 LD B, 18H D9 EXX CB 1C RR H CB 1D RR L CB 1A RR D D9 EXX 30 02 MP3A: JR NC MP3B 19 ADD HL, DE 89 ADC C 1F MP3B: RR A CB 1C RR H CB 1D RR L D9 EXX CB 1C RR H CB 1D RR L OB 1A RR D D9 EXX 10 ED DJNZ MP3A C9 RET ========================================================= Division natürlicher Zahlen (1) E:= A-E / C Rest in A VR: AF, BC, DE ------------------------------------------------------------------------------------------------------- B9 DV1 : CP C 3F CCF D8 RC 06 08 LD B, 8H 91 DV1A: SUB C 37 DV1B: SCF 05 DEC B 28 0C JR Z DV1D CB 13 DV1C: RL E 17 RL A 38 F6 JR C DV1A. 91 SUB C 30 F4 JR NC DV1B 81 ADD C A7 AND A 10 F4 DJNZ DV1C CB 13 DV1D: RL E C9 RET ------------------------------------------------------------------------------------------------------ (2) A-C := HL-A-C / DE Rest in HL VR: AF, HL, DE, BC ------------------------------------------------------------------------------------------------------ 06 10 DV2: LD B, 10H CB 11 DV21: RL C 17 RL A ED 6A ADC HL, HL ED 52 SBC HL, DE 3F DV22: CCF 30 12 JR NC DV25 10 F4 DV23: DJNZ DV21 CB 11 RL C 17 RL A C9 RET CB 11 DV24: RL C 17 RL A ED 6A ADC HL, HL B7 OR A ED 5A ADC HL, DE 38 F0 JR C DV23 28 EB JR Z DV22 10 F2 DV25 : DJNZ DV24 CB 11 RL C 17 RL A 19 ADD HL, DE C9 RET vorher: n mal Rotation nach links des Zählers ergibt n Komma- stellen im Ergebnis. ====================================================== DIVISION (30 Bit / 15 Bit) BC:= HL-BC / DE VR: AF, HL, DE, BC -------------------------------------------------------------------------------------------------- 3E 11 DIV2: LD A, 17 B7 OR A ED 52 ZYK: SBC HL, DE 19 ADD HL, DE 3F KRUE: CCF CB 11 RL C CB 10 RL B 3D DEC A 20 F2 JR NZ ZYK C9 RET ======================================================= 8-Bit-Division :2 (mit Aufrunden) A:= A / 2 VR: AF, B --------------------------------------------------------------------------------------------------- B7 OR A 1F RR A 47 LD B, A AF XOR A 17 RL A 80 ADD B C9 RET ======================================================== 8-Bit-Division :2 (mit Nachkommastellen) B-A := A / 2 nachher: B:= Vorkomma A:= Nachkomma VR: AF, B ------------------------------------------------------------------------------------------------------ B7 OR A 1F RR A 47 LD B, A AF XOR A 1F RR A C9 RET ========================================================= Quadratwurzel (1) A:= Quadratwurzel (HL) HL:= max. 7FF9H, ganze Zahl VR: AF, HL, DE ------------------------------------------------------------------------------------------------------- AF XOR A 3D DEC A 11 FF FF LD DE, 0FFFFH 3C LOOP: INC A 13 INC DE 13 INC ED 52 SBC HL, DE F2 xx yy JP P LOOP C9 RET ========================================================= Quadratwurzel (2) DE:= Quadratwurzel (DE) vorher: DE: 15 stell. Festkommazahl Z<1 VR: AF, HL, DE, BC ------------------------------------------------------------------------------------------------------ EB EX DE, HL 11 00 E0 LD DE, 0E000H 19 ADD HL, DE 11 00 00 LD DE, 0H 01 00 20 LD BC, 2000H CB 7C TEST: BIT 7, H 20 13 JR NZ UNEG EB UPOS: EX DE, HL 09 ADD HL, BC EB 52 SBC HL, DE CB 25 _ SLA L CB 14 RL H CB 38 SRL B CB 19 RR C 38 13 JR C END ED 42 SBC HL, BC 18 E9 JR TEST 19 UNEG: ADD HL, DE CB 25 SLA L CB 14 RL H 09 ADD HL, BC CB 38 SRL B CB 19 RR C 38 03 JR C END 09 ADD HL, BC 18 DA JR TEST CB 22 END: SLA D CB 13 RL E C9 RET t=360 us ======================================================== Quadratwurzel (3) B:= Quadratwurzel (HL) VR: AF, HL, DE, B ----------------------------------------------------------------------------------------------------- 06 01 LD B,1 H 11 01 00 LD DE, 1 H 7D M1: LD A, L 93 SUB E 27 DAA 6F LD L, A 9A SBC D 27 DAA 67 LD H, A 38 14 JR C M3 B5 OR L 28 16 JR Z M2 C6 02 ADD 2H 27 DAA 5F LD E, A 7A LD A, D CE 00 ADC 0H 27 DAA 57 LD D, A 78 LD A, B C6 01 ADD 1H 27 DAA 47 LD B, A 18 E3 JR M1 78 M3: LD A, B D6 01 SUB 1H 27 DAA 47 LD B, A C9 M2: RET ======================================================== Quadratwurzel (4) vorher: HL:= echt gebrochene Zahl 15 Bit Z<1 VR: AF, HL, DE, BC ---------------------------------------------------------------------------------------------------- 01 00 40 WU2R: LD BC, 4000H 11 00 00 LD BC, 0H 22 xx yy K4: LD (ADR), HL AF XOR A ED 52 SBC HL, BC 38 1D JR C K17 CB 15 RL L CB 14 RL H AF XOR A A9 XOR C 20 1E JR NZ K19 7C LD A, H 90 SUB B 67 LD H, A 38 10 JR C K17 7A LD A, D B0 OR B 57 LD D, A CB 18 K12: RR B 30 E4 JR NC K4 CB 18 RR B AF XOR A 81 ADD C C0 RNZ 0E 01 LD C,1H 18 DB JR K4 2A xx yy K17: LD HL, (ADR) CB 25 SLA L CB 14 RL H 18 EA JR K12 7D K19: LD A, D 90 SUB B 6F LD L, A 7C LD A, H DE 00 SBC 0H 67 LD H, A 38 EE JR C K17 7B LD A, E B0 OR B 5F LD E, A 18 DC JR K12 ===================================================== Konvertierung Dual - Dezimal vorher: HL:= Dualzahl, max. 07CF H nachher: HL:= Dezimalzahl, max. 1999 VR: AF, HL, DE, B ------------------------------------------------------------------------------------------------ 11 00 00 LD DE, 0H 29 ADD HL, HL 29 ADD HL, HL 06 0E LD B, 0EH 29 DW1: ADD HL, HL 7B LD A, E 8F ADC A 27 DAA 5F LD E, A 7A LD A, D 8F ADC A 27 DAA 57 LD D, A 10 F5 DJNZ DW1 EB EX DE, HL C9 RET ===================================================== KONVERTIERUNG: DUAL (16 Bit) in BCD (5 Stellen) vorher: HL:= Dualzahl nachher: A-HL:= BCD- (Dezimal-) Zahl VR: AF, HL, DE ----------------------------------------------------------------------------------------------- AF BO12: XOR A 57 LD D, A 06 10 LD B, 10H 29 ZYK: ADD HL, HL 8F ADD A 27 DAA 5F LD E, A 7A LD A, D 8F ADC A 27 DAA 57 LD D, A CB 11 RL C 7B LD A, E 10 F3 DJNZ ZYK EB EX DE, HL 79 LD A, C C9 RET ===================================================== Konvertierung Dezimal - Dual vorher: B:= Hundertertetrade C:= Zehner- u. Einertetrade nachher: C-D:=Binärzahl VR: AF, DE, BC, H ------------------------------------------------------------------------------------------------ 26 08 LD H, 8H 78 LOOP: LD A, B 1F RR A 47 LD B, A 79 LD A, C 1F RRA 4F LD C, A 7A LD A, D 1F RR A 57 LD D, A 79 KORR: LD A, C E6 88 AND 88H 1F RR A 1F RR A 5F LD E, A 1F RR A B3 OR B 5F LD E, A 79 LD A, C 93 SUB E 4F LD C, A 25 DEC H 20 E8 JR NZ LOOP C9 RET ======================================================= KOMPRESSOR zum schnell-SAVE des Pixel-RAM vorher: DE:= Adresse der Zwischenablage VR: AF, HL, DE, BC --------------------------------------------------------------------------------------------------- D5 PUSH DE 21 00 80 LD HL, 8000H 0E 00 LD C, 0H AF NEXT2: XOR A BE CP (HL) 28 26 JR Z REND 7D LD A, L 12 LD (DE), A 13 INC DE 7C LD A, H 12 LD (DE), A 13 INC DE D5 PUSH DE 13 INC DE C5 NEXT1: PUSH BC ED A0 LDI C1 POP BC 0C INC C E5 PUSH HL 06 04 LD B, 4H AF XOR A BE LOOP: CP (HL) 20 0F JR NZ NBYTE 23 INC HL 10 FA DJNZ LOOP 79 LD A, C C1 POP BC C1 POP BC D5 PUSH DE C5 PUSH BC D1 POP DE 12 LD (DE), A D1 POP DE 0E 00 LD C, 0H 18 04 JR END E1 NBYTE: POP HL 18 E2 JR NEXT1 23 REND: INC HL 7C END: LD A, H FE A0 (A8) CP A0H ;A8 für ges. 20 D0 JR NZ NEXT2 Pixel-RAM 13 INC DE E1 POP HL | |----------> Beginn der SAVE-Routine HL:= Anf.-Adr. für SAVE-Routine DE:= End-Adr. für SAVE-Routine ======================================================== EXPANDER zum schnell-LOAD des Pixel-RAM vorher: LOAD-Routine (gem. KOMPRESSOR-SAVE) HL:= Adr. der Zwischenablage (Zwischenablage Null setzen!) ---------------------------------------------------------------------------------------------------- E5 PUSH HL E1 NEXT1: POP HL 5E LD E, (HL) 23 INC HL 56 LD D, (HL) 23 INC HL 46 LD B, (HL) 23 INC HL C5 LOOP: PUSH BC ED A0 LDI C1 POP BC 10 FA DJNZ LOOP E5 PUSH HL AF XOR A BE CP (HL) 20 EE JR NZ NEXT1 23 INC HL BE CP (HL) 20 EA JR NZ NEXT1 E1 POP HL Bem.: vorher LOAD-Routine Anfang bei 0542H bis 0E4FH von 0E33H bis 0E3FH von 0E53H bis 0E5FH (Ende) ===================================================== Sortier-Routine vorher: HL:= Adresse der Daten C:= Anzahl der zu sortierenden Elemente (1 ... 256) nachher: Daten in aufsteigender Reihenfolge sortiert VR: AF, HL, DE, BC, IX ----------------------------------------------------------------------------------------------- 22 xx yy SORT: LD (ADR1), HL ;Retten der Datenadresse CB 84 LOOP: RES 0, H ;Anf.-Wert zu Austauschflag 41 LD B, C ;Anf.-Wert zu Längenzähler 05 DEC B ;Einstellen zum Test DD 2A xx yy LD IX, (ADR1) ;Anf.-Wert zu Feldzeiger DD 7E 00 NEXT: LD A, (IX+0) ;1.Element im Vergleich 57 LD D, A ;Zeitwerspeicher F, Element DD 5E 01 LD E; (IX+1) ;2.Element im Vergleich 93 SUB E ;Vergleich 1. mit 2. 30 08 JR NC NOEX ;kein Spr., wenn 1. größer 2. DD 73 00 LD (IX), E ;Austausch von Feldelementen DD 72 01 LD (IX+1), D CB C4 SET 0, H ;notieren: Austausch erfolgt DD 23 NOEX: INC IX ;nächste Datenelementadresse 10 EA DJNZ NEXT ;zählen der Anzahl von Vergl., ;Wdh wenn mehr Datenpaare CB 44 BIT 0, H ;ermitteln, ob Vertausch erfolgt 20 DE JR NZ LOOP ;weiter, wenn Daten unsortiert C9 RET ;sonst Ende 00 00 ADR1: 2 BYTE ========================================================================